// 接口interface
function drawPoint(x:number,y:number){
  console.log({x,y})
}
console.log(18,80)
// 接口 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。
interface myPot{
   x:number,
   y:number
}

// 函数参数  
// 用接口myPot 来限制Ipoint 参数类型
function draw(Ipoint:myPot){
  console.log({x:Ipoint.x,y:Ipoint.y})
}
draw({x:50,y:90})

// readonly 代表x 和y 是只读属性
interface Ls {
  readonly x: number;
  readonly y: number;
}

// 面向对象
// es5 的构造函数
function Say(name:string,color:number){
    this.name=name;
    this.color=color;
    this.run=function(){}
}
let xiaowang=new Say("小王",18);

// ts 的构造函数
class Person{
      name:string;
      age:number
      constructor(myname,myage){
          this.name=myname;
          this.age=myage;
      }
      eat(food){
        console.log(this.name+food)
      }
}

class Student extends Person{
      grade:number
      banji:string
      constructor(grade,banji){
        super("李哲书",18);
        this.grade=grade;
        this.banji=banji;
      }
}
var li=new Student("20","11")

li.eat("吃6个馒头")

let xiaolong=new Person("小龙","18")
console.log(xiaolong)
xiaolong.eat("车厘子")
// 面对 对象
  //  女朋友
  //         属性  shengao tizhong  zhangxiang 
  //         私有属性  三维
  //         方法  
  //              吃饭  玩智能手机  
  //         继承 extends
  //              生孩子  
  //         封装
  //             吃饭  玩智能手机 
  //         多态

// 实现接口
interface CarFace{
   name:string,
   color:string,
   run(abc:string):void,
   jia(L:number):void
}
// implements 用类 实现接口
// class Car implements CarFace{
//       name:string;
//       color:string;
//       constructor(name,color){
//         this.name=name;
//         this.color=color;
//       }
//       run(abc:string){
//           console.log(this.name)
//       } 
//       jia(L: number) {
//         console.log(L)
//       }
// }
//   let benchi=new Car("奔驰","蓝色");
//   console.log(benchi)
//   benchi.jia(55)

// class类的修饰符 
// public 公共的  谁都可以使用   用来修饰 属性和方法
// private 私有的  只能在类的内部使用    用来修饰 属性和方法
// protected修饰符 受保护的  与 private修饰符的行为很相似，但有一点不同， protected成员在派生类中仍然可以访问。
class Animal{
   public name:string;
   public age:number;
   private sex:boolean; //私有属性
    constructor(name?:string,age?:number,sex?:boolean){
      this.name=name;
      this.age=age;
      this.sex=sex;
    }
    public eat(){
      console.log("吃")
      this.sleep();
    }
    // protected 受保护的方法
    protected jump(){
      console.log("跳")
    }
    // 私有方法  只能在当前类中调用
    private sleep(){
        console.log("睡觉")
    }
    run(){
        if(this.sex){
          console.log("跑步")
        }else{
          console.log("不跑步")
        }
    }
    // static 静态方法
    static jiao(){
      console.log("giao");
    }
}
Animal.jiao() //静态方法的调用 类名.方法()
let tom=new Animal("旺财",5,true);
console.log(tom.name)
console.log(tom.age);
tom.eat()
tom.run()

// 
 class Dog extends Animal{
  // 只读属性
  readonly kkk: string="今天星期一";
  constructor(public tizhong:number,protected color:string){
    super("汤姆",3,true);
    this.color=color;
    this.tizhong=tizhong;
  }
  public look(){
      console.log("ccc")
      this.jump();//调用到了父类中的受保护的方法
  }
}
var wang=new Dog(188,"green")
wang.look();
wang.tizhong=200;
console.log(wang.kkk)

// ts可以完全使用es6的模块化
